// 全局扫码服务，用于在任何页面捕获扫码枪输入

import { ElMessage } from 'element-plus';
import { APIs } from '@/Http/http';
import router from '@/router';

class GlobalScanner {
  // 扫描缓冲区
  private scanBuffer: string = '';
  // 扫描计时器
  private scanTimer: number | null = null;
  // 扫描状态
  private isScanning: boolean = false;
  // 上次按键时间
  private lastKeyTime: number = 0;
  // 扫码枪输入的最小字符数
  private minCodeLength: number = 6;
  // 最大按键间隔时间(ms)，超过这个时间认为是手动输入
  private maxKeyInterval: number = 100;
  // 当前激活的输入框
  private activeInputElement: HTMLElement | null = null;
  // 扫码回调函数列表
  private callbacks: Array<(code: string) => void> = [];
  // 存储扫描的code与对应产品信息的映射，确保每次跳转使用正确的shangId
  private scannedCodeMap: Map<string, { finisheId: string, productState: number, productName: string }> = new Map();
  
  // 初始化扫码服务
  init() {
    // 监听全局键盘事件
    document.addEventListener('keydown', this.handleKeyDown.bind(this));
    // 监听输入框焦点事件，避免在用户输入时触发扫码
    document.addEventListener('focusin', this.handleFocusIn.bind(this));
    document.addEventListener('focusout', this.handleFocusOut.bind(this));
    console.log('全局扫码服务已启动');
  }
  
  // 销毁扫码服务
  destroy() {
    document.removeEventListener('keydown', this.handleKeyDown.bind(this));
    document.removeEventListener('focusin', this.handleFocusIn.bind(this));
    document.removeEventListener('focusout', this.handleFocusOut.bind(this));
    if (this.scanTimer) {
      clearTimeout(this.scanTimer);
    }
    // 清空映射表
    this.scannedCodeMap.clear();
  }
  
  // 处理输入框焦点进入
  private handleFocusIn(event: FocusEvent) {
    if (event.target instanceof HTMLInputElement || 
        event.target instanceof HTMLTextAreaElement || 
        event.target instanceof HTMLSelectElement) {
      this.activeInputElement = event.target;
    }
  }
  
  // 处理输入框焦点离开
  private handleFocusOut() {
    this.activeInputElement = null;
  }
  
  // 处理键盘按键事件
  private handleKeyDown(event: KeyboardEvent) {
    // 如果有活跃的输入框，不进行扫码处理
    if (this.activeInputElement) {
      return;
    }
    
    // 忽略功能键
    if (event.key.length > 1 && event.key !== 'Enter') {
      return;
    }
    
    const now = Date.now();
    const keyInterval = now - this.lastKeyTime;
    this.lastKeyTime = now;
    
    // 检测是否可能是扫码枪输入
    if (!this.isScanning && event.key !== 'Enter') {
      // 第一个字符，开始新的扫描
      this.isScanning = true;
      this.scanBuffer = event.key;
    } else if (this.isScanning) {
      // 检测按键间隔，如果太长，认为是手动输入
      if (keyInterval > this.maxKeyInterval && event.key !== 'Enter') {
        this.isScanning = false;
        this.scanBuffer = '';
        return;
      }
      
      if (event.key === 'Enter') {
        // 扫码结束标志
        event.preventDefault();
        if (this.scanBuffer.length >= this.minCodeLength) {
          // 扫码完成，处理扫码结果
          this.handleScanComplete(this.scanBuffer);
        }
        this.isScanning = false;
        this.scanBuffer = '';
      } else {
        // 添加字符到缓冲区
        this.scanBuffer += event.key;
      }
    }
  }
  
  // 扫码完成处理
  private handleScanComplete(code: string) {
    console.log('全局扫码捕获:', code);
    
    // 执行所有回调函数
    this.callbacks.forEach(callback => {
      try {
        callback(code);
      } catch (error) {
        console.error('扫码回调执行失败:', error);
      }
    });
    
    // 默认处理逻辑 - 入库并跳转到仓库分配页面
  }
  

  
  // 通过扫描的code精确查找产品信息
  private getProductInfoByCode(code: string) {
    APIs.get('/api/Read/ShowRuku').then(res => {
      if (res.data.code === 100 && res.data.data && res.data.data.length > 0) {
        // 尝试通过code查找对应的产品
        let targetProduct = null;
        
        console.log('搜索产品信息，扫描码:', code);
        
        // 1. 先尝试精确匹配code（尝试不同的字段，确保找到匹配项）
        targetProduct = res.data.data.find((item: any) => 
          item.sid === code || 
          String(item.shangId) === code || 
          item.productCode === code ||
          String(item.finisheId) === code
        );
        
        // 2. 如果没有精确匹配，按创建时间排序，取最新的
        if (!targetProduct) {
          const sortedProducts = [...res.data.data].sort((a: any, b: any) => {
            const timeA = new Date(a.createTime || 0).getTime();
            const timeB = new Date(b.createTime || 0).getTime();
            return timeB - timeA; // 降序排列，最新的在前
          });
          
          targetProduct = sortedProducts[0];
        }
        
        if (targetProduct) {
          this.handleProductInfo(code, targetProduct);
        } else {
          console.error('未找到对应的产品信息');
          ElMessage.warning('未找到对应的产品信息');
        }
      }
    }).catch(error => {
      console.error('获取产品信息失败:', error);
      ElMessage.error('获取产品信息失败');
    });
  }
  
  // 处理获取到的产品信息并跳转
  private handleProductInfo(code: string, productInfo: any) {
    if (productInfo && (productInfo.finisheId)) {
      // 存储扫描code与产品信息的映射
      const productData = {
        finisheId: productInfo.finisheId,
        productState: productInfo.productState,
        productName: productInfo.productName
      };
      
      this.scannedCodeMap.set(code, productData);
      
      console.log('获取的产品状态信息:');
      console.log('扫描码:', code);
      console.log('产品ID:', productData.finisheId);
      console.log('产品名称:', productData.productName);
      console.log('产品状态:', productData.productState);
      
      router.push({
        path: '/CangKuFenPei',
        query: {
          autoAllocate: 'true',
          Find: productData.finisheId, // 修改为CangKuFenPei.vue期望的参数名
          productState: productData.productState,
          scanCode: code // 额外传递扫描码，用于调试
        }
      });
    } 
  }
  
  // 添加扫码回调函数
  addCallback(callback: (code: string) => void) {
    this.callbacks.push(callback);
  }
  
  // 移除扫码回调函数
  removeCallback(callback: (code: string) => void) {
    const index = this.callbacks.indexOf(callback);
    if (index > -1) {
      this.callbacks.splice(index, 1);
    }
  }
  
  // 获取扫描码对应的产品信息（供其他组件调用）
  getProductInfoByScanCode(code: string) {
    return this.scannedCodeMap.get(code);
  }
}

// 导出单例实例
const globalScanner = new GlobalScanner();
export default globalScanner;